package br.edu.universo.si.projeto2.infojob.server.negocio;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaPerfil;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanVaga;
import br.edu.universo.si.projeto2.infojob.server.Database;
import br.edu.universo.si.projeto2.infojob.server.excecoes.CNPJExistenteException;
import br.edu.universo.si.projeto2.infojob.server.excecoes.ContaExistenteException;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PEmpresa;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PEmpresaPerfil;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PLogin;

public class NEmpresa
{
	public static void cadastrarEmpresa(BeanEmpresaAssinante bEmpresaAssinante) throws Exception
	{
		try
		{
			String conta = bEmpresaAssinante.getConta();

			// verifica se a conta ja existe no sistema
			if (PLogin.isEmpresa(conta) || PLogin.isProfissional(conta))
			{
				throw new ContaExistenteException();
			}
			
			// verifica se o CNPJ ja existe no sistema
			if (PEmpresa.isCNPJCadastrado(bEmpresaAssinante.getCnpj()))
			{
				throw new CNPJExistenteException();
			}

			PEmpresa.cadastrarEmpresaAssinante(bEmpresaAssinante);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ContaExistenteException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.getMessage());
		}
		catch (CNPJExistenteException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.getMessage());
		}
	}

	public static BeanEmpresaAssinante getEmpresaById(Integer idEmpresa) throws Exception
	{
		try
		{
			  return PEmpresa.getEmpresaById(idEmpresa);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
	}
	
	public static void alterarEmpresaAssinante(BeanEmpresaAssinante bEmpresaAssinante) throws Exception
	{
		try
		{
			PEmpresa.alterarDadosEmpresaAssinante(bEmpresaAssinante);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
	}

	public static void cadastrarEmpresaPerfil(BeanEmpresaPerfil bEmpresaPerfil) throws Exception
	{
		try
		{
			PEmpresaPerfil.cadastrarEmpresaPerfil(bEmpresaPerfil);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		  
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
	}
	
	public static void alterarEmpresaPerfil(BeanEmpresaPerfil bEmpresaPerfil) throws Exception
	{
		try
		{
			  PEmpresaPerfil.alterarEmpresaPerfil(bEmpresaPerfil);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
	}
	
	public static BeanEmpresaPerfil getEmpresaPerfil(Integer idEmpresa) throws Exception
	{
		try
		{
			  return PEmpresaPerfil.getEmpresaPerfil(idEmpresa);
		}
		catch (SQLException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
		catch (ClassNotFoundException ex)
		{
		  ex.printStackTrace();
		  throw new Exception(ex.toString());
		}
	}
	
	public static void getTodasVagasDaEmpresa() throws Exception
	{
		
	}
	
	public static void encerrarContaEmpresa(BeanEmpresaAssinante bEmpresaAssinante) throws Exception
	{
		Database database = Database.getInstance();

		Connection conn = database.getConnection();
		conn.setAutoCommit(false);

		try
		{
			// lista de todas as vagas da empresa
			ArrayList<BeanVaga> clVagas = NVagas.getTodasVagasDaEmpresa(conn, bEmpresaAssinante);

			// exclui cada vaga, uma por uma
			for (BeanVaga vaga : clVagas)
			{
				NVagas.excluirVaga(vaga.getId());
			}

			NEmpresa.excluirEmpresaPerfil(conn, bEmpresaAssinante); // excluir o perfil da empresa
			PEmpresa.excluirEmpresa(conn, bEmpresaAssinante); // exclui a empresa propriamente dita
		}
		catch (ClassNotFoundException ex)
		{
			conn.rollback();
			ex.printStackTrace();
			throw new Exception(ex.toString());
			
		}
		catch (SQLException ex)
		{
			conn.rollback();
			ex.printStackTrace();
			throw new Exception(ex.toString());			
		}
		catch (Exception ex)
		{
			conn.rollback();
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}

		conn.commit();
	}
	
	public static void excluirEmpresaPerfil(Connection conn, BeanEmpresaAssinante bEmpresaAssinante)
		throws Exception
	{
		PEmpresa.excluirEmpresaPerfil(conn, bEmpresaAssinante);
	}
}